package tur.br.moradadosol.dao.implementacao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Collection;

import tur.br.moradadosol.dao.DespesaDAO;
import tur.br.moradadosol.model.Despesa;
import tur.br.moradadosol.model.TipoDespesa;
import tur.br.moradadosol.util.Conf;
import tur.br.moradadosol.util.Util;

public class SQLDespesaDAO implements DespesaDAO {
	
	private Connection connection;
	
	public SQLDespesaDAO(Connection conn) {
		connection = conn;
	}
	
	public void delete(int codigo) throws Exception {
		String sql = "delete from " + Conf.getProp("DESPESA") + " where CODIGO = ?";
		
		PreparedStatement pstm = connection.prepareStatement(sql);
		
		pstm.setInt(1, codigo);
		
		pstm.executeUpdate();
	}

	public Despesa getDespesaByCodigo(int codigo) throws Exception {
		String sql = "select * from " + Conf.getProp("DESPESA") + " where CODIGO = ?";
		
		PreparedStatement pstm = connection.prepareStatement(sql);
		
		pstm.setInt(1, codigo);
		
		ResultSet rs = pstm.executeQuery();
		
		Despesa despesa = getDespesa(rs);
		
		SQLTipoDespesaDAO sqlTipoDespesaDAO = new SQLTipoDespesaDAO(connection);
		
		TipoDespesa tipoDespesa = sqlTipoDespesaDAO.getTipoDespesaByCodigo(
			rs.getInt("TIPO_DESPESA"));
		
		despesa.setTipoDespesa(tipoDespesa);
		
		return despesa;
	}

	public Collection getDespesasByMesAno(int mes, int ano) throws Exception {
		return null;
	}

	public Collection getDespesasByTipoAno(TipoDespesa tipoDespesa, int ano)
		throws Exception {
		return null;
	}

	public Collection getDespesasByTipoMesAno(
		TipoDespesa tipoDespesa,
		int mes,
		int ano)
		throws Exception {
		return null;
	}

	public void insert(Despesa despesa) throws Exception {
		String sql = "select max(CODIGO) + 1 as CODIGO from " + Conf.getProp("DESPESA");
		
		PreparedStatement pstm = connection.prepareStatement(sql);
		
		ResultSet rs = pstm.executeQuery();
		
		if(rs.next()) {
			despesa.setCodigo(rs.getInt("CODIGO"));
		}
		
		sql = "inset into " + Conf.getProp("DESPESA") + " (CODIGO, TIPO_DESPESA, VALOR, DATA_VENCIMENTO"
			+ "DATA_PAGAMENTO, OBSERVACAO) values (?,?,?,?,?,?)";
		
		int index = 1;
		
		pstm = connection.prepareStatement(sql);
		
		pstm.setInt(index++, despesa.getCodigo());
		pstm.setInt(index++, despesa.getTipoDespesa().getCodigo());
		pstm.setFloat(index++, despesa.getValor());
		pstm.setDate(index++, Util.getDataDate(despesa.getDataVencimento()));
		pstm.setDate(index++, Util.getDataDate(despesa.getDataPagamento()));
		pstm.setString(index++, despesa.getObservacao());
		
		pstm.executeUpdate();
	}

	public void update(Despesa despesa) throws Exception {
		String sql = "update " + Conf.getProp("DESPESA") + " set TIPO_DESPESA = ?, VALOR = ?, "
			+ "DATA_VENCIMENTO = ?, DATA_PAGAMENTO = ?, OBSERVACAO = ? where "
			+ "CODIGO = ?";
		
		int index = 1;
		
		PreparedStatement pstm = connection.prepareStatement(sql);
		
		pstm.setInt(index++, despesa.getCodigo());
		pstm.setInt(index++, despesa.getTipoDespesa().getCodigo());
		pstm.setFloat(index++, despesa.getValor());
		pstm.setDate(index++, Util.getDataDate(despesa.getDataVencimento()));
		pstm.setDate(index++, Util.getDataDate(despesa.getDataPagamento()));
		pstm.setString(index++, despesa.getObservacao());
		
		pstm.executeUpdate();
	}
	
	private Despesa getDespesa(ResultSet rs) throws Exception {
		Despesa despesa = new Despesa();
		
		despesa.setCodigo(rs.getInt("CODIGO"));
		despesa.setValor(rs.getFloat("VALOR"));
		despesa.setDataVencimento(
			Util.getDataCalendar(rs.getDate("DATA_VENCIMENTO")));
		despesa.setDataPagamento(
			Util.getDataCalendar(rs.getDate("DATA_PAGAMENTO")));
		despesa.setObservacao(rs.getString("OBSERVACAO"));
		
		return despesa;
	}
}
